逐次処理からの脱出② スレッドとプロセス
プロセスとは
実行中のアプリケーション / プログラムのことを指す
プロセスの実体は、メモリに確保される専用の記憶領域
OSは、アプリケーション / プログラムからプロセスを生成する際に、メモリの中に専用領域を確保する
プログラムコードや変数用のデータ領域などをまとめて確保する
詳細は -> 逐次処理からの脱出② スレッドとプロセス#62559ef6b3641f0000ad307a
プロセスは与えられた記憶領域の中で、プログラム処理をやりくりする
32bit OSなら、1プロセスに対して利用可能なメモリサイズは4GB、64bitならほぼ無制限に利用可能
プロセスが終了すると、確保された領域は解放される
スレッドとは
プロセスの中に絶対1つは存在するやつ
CPUコアの実行単位で、CPUのコンテキストスイッチなどは、スレッド単位で行われてる
スレッドはプロセスから生まれる
スレッドはプロセスの記憶領域をそのまま利用する
この特性から、同じプロセス内で生まれた別スレッドと記憶領域を共有することになる
このことは、マルチスレッドにしたときにバグを生む可能性がある
そうならないように設計・実装してる状態のことを「スレッドセーフ」という
注意:スレッドごとに専用のスタック領域は確保されるが、それは記憶領域内の空いてるところで確保されるだけである
また、スタック領域が確保されるされないに関わらず、記憶領域内のどこにでもアクセスできることに注意されたし
CPUレジスタと関連が深い
スレッドはCPUレジスタだけ割り当てられ、そのほかの資源は親プロセスから継承し、プロセス内の他のスレッドと共有します。
ググる中で気になった文言
コンピューターの本体はCPUで、CPUが作業する領域がメモリ、その間を取り持つのがOS
OSはソフトウェアとハードウェアの間を取り持つやつだったよな?onigiri.w2.icon
厳密に言うとカーネルがそうやったかな?
カーネル(英: kernel)は、階層型に設計されたオペレーティングシステム (OS) の中核となる部分で、アプリケーションとハードウェアの架け橋である。 具体的には、システムのリソースや、ハードウェアとソフトウェアの連携を管理する。 その他、通信制御も行う事が多い。
そうっぽい。カーネル - Wikipedia
プレイヤー(CPU)の頭脳のことをコア(core) といいます。
コアのClock数によって計算能力が変わってくる的な?
OSは、アプリケーションごとに記憶領域を確保すると説明しましたが、この記憶領域内に構成される一式をプロセスと呼び、アプリケーショを使用するためのプログラムを始め、それに関わるすべてのデータが引き出し(ハードディスク)からここに置かれます。
めっちゃわかりやすい説明onigiri.w2.icon
https://storage.googleapis.com/zenn-user-upload/d49ad3abacec-20220119.png
アプリケーションごとに記憶領域を確保するので、AプロセスとBプロセスの記憶領域が共有することはありません。つまり、同じ画像やテキストを使う事はないという事です。
ふむふむonigiri.w2.icon
確保できるプロセスの記憶領域は、32bit版WindowsOSで理論値として最大2GB、64bit版では基本的に制限はありません。
ホイホイonigiri.w2.icon
コンピュータ上で実行されているプログラム(プロセス)が、自身の複製を作成して新たなプロセスとして起動することをフォークという。
はいはい理解してきましたonigiri.w2.icon
並列処理を行う際、マルチプロセスを採用する場合はフォークを利用してそうな雰囲気がある。
プロセスが使用するデータは、必ず記憶領域に置いてから作業します。 このデーターを記憶領域に出し入れする作業はOSが行い、これによりCPUは引き出し(ハードディスク)のどこにあるかを探すことなく、机(メモリ)だけを見て作業をすることが可能となります。
はいはいはい。なるほどねonigiri.w2.icon
アプリケーションがどうやって動作してるのか?からちゃんと理解しておく必要があるな
プロセスはテキストセグメントとデータセグメントに分かれた構造をしており、主に以下のような構成となります。
テキストセグメントは、プログラムそのものらしい
データセグメントには、スタック領域とデータ領域に分かれる
データ領域はさらに、ヒープ領域と静的領域に分かれる
ヒープ領域
任意のタイミングで確保や解放をすることができる領域です。変数などのように、実行するまで容量が未確定で一時的に必要とする動的なデータが置かれます。例えば、読み込んだファイルの内容や、送受信のデータなどです。
静的領域
定数やグローバル変数など、予め静的に決定しているデータを格納します。
PDAて言うやつの領域も確保されてるらしい
スタック領域のどこを見ているかを指すSP(スタックポインタ) と、プログラムのどこを実行しているかを指すPC(プログラムカウンタ) が格納されます。
よくあるプロセス間通信とは?
プロセス間はデータを共有しない(できない)のだが、それでもプロセス間でデータをやり取りしたいときに利用する技術のこと
1つのプロセスの中には1つ、もしくは複数のスレッドが含まれており、このスレッドが実際にCPUで実行される単位となる。
プロセスの中には少なくとも1つはスレッドがあるのねonigiri.w2.icon
そしてCPUで実行される単位はこのスレッドだと。なるほど
同一プロセスに属するスレッドは、同じコードやデータ、ヒープ、DLLなどのメモリ空間を共有しており、各スレッドがそれらのデータなどを参照しながら、協調して動作するようになっている。
はいはい。プロセスの中で生まれてるわけやから、プロセスの記憶領域を共有するよねとonigiri.w2.icon
気になるのは、スレッドはどのタイミングで2つ以上生まれてるのだろうか?onigiri.w2.icon
普通にプログラミングしてるだけやと、1スレッドだけなのだろうか?
恐らくこれの答えは後者onigiri.w2.icon
普通にプログラミングしてるだけなら、スレッドは1つしか存在しない
全ての処理を逐次実行で書いてるなら、スレッドは1つでいい。2つ以上も必要ない。
同じスレッドが1つのCPUコアをずっと占有し続けていればいい話。
わざわざ2つのスレッドを作って、切り替えとかしてごちゃごちゃしても全く意味ない。
スレッドとは、プロセス内で命令を逐次実行する部分であり、CPU コアを利用する単位のことです。
スレッドの中自体は、逐次実行なのね。まあ、直感的に考えるとそうよなonigiri.w2.icon
つまり、プログラムを書くときは、自らマルチスレッドの書き方をしない限り、そのプログラムはシングルスレッドで動くことになる。
起動中の個々のプログラム(アプリケーションソフト)はプロセスという実行単位で管理され、プロセスはさらにスレッドというひとつ以上の実行単位に分割されてCPUに逐次処理される。
プロセスってのは記憶領域と言い換えても良さそう。
CPUで処理される単位をスレッドと言う感じ。
基本的に意識しない限りは、1プロセス1スレッドで動いてるはず。
意識することで、1プロセス複数スレッドの構成にしていく
スレッドとは、CPUから見たプログラムの「実行単位」です。
CPUは基本的に1つのコアで1つの処理しか実行することはできません。
その処理単位がスレッドと呼ばれます。
今までプロセス単位でCPUを使ってると認識してたけど、そうじゃないんかonigiri.w2.icon
スレッド単位でCPUを使ってる感じなんやな
割り込みとかも全部スレッド単位での話なのかもしれない
プロセスも結局は1つ以上のスレッドを持ってることから、この理解の仕方はズレてなさそう。
前述の通り、SMT (同時マルチスレッディング) 登場以前では 1 スレッドに 1 コアが基本でした。
ですが最近の CPU は、SMT (Intel ではハイパースレッディングと呼ぶ) 機能を搭載しているモデルが多くなってきており、この機能を使うと、1 つのコアに対して複数のスレッド (多くは 2 つのスレッド) を割り当てることができます。
物理的に 1 つのコアを、OS からは 2 つのコアであるように見せかけることができ、コアの利用率を上げることができるのです。
はえええええええonigiri.w2.icon
なるほど、そう言うことか。
スレッドとCPUコアの関係を理解した今なら、より明確にハイパースレッディングの言ってることを理解できるようになった気がする
必ずしもコア数=最大並列数というわけではないんだなと。
参考
非同期処理 プロセスとスレッド|業務ができる中級者になるためのJavaScript入門(文法編)
プロセスとスレッドの違い - IMOKURI Blog
【図解】CPUのコアとスレッドとプロセスの違い,コンテキストスイッチ,マルチスレッディングについて | SEの道標
プロセスとスレッドの違いとは?超わかりやすく解説!【図解とプログラム付き】 | Webpia